/*
 * @Author: 生俊甫 1758142861@qq.com
 * @Date: 2024-06-05 14:07:57
 * @LastEditors: 生俊甫 1758142861@qq.com
 * @LastEditTime: 2024-06-05 15:11:54
 * @FilePath: /sjf/2024-project/2024_centos/pro_knowledge/jscpp_test.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <string>
#include <sstream>
#include <jsoncpp/json/json.h>

//序列化
std::string serialize()
{
    //1.序列化初一个Json::Value对象
    Json::Value root;
    root["姓名"] = "张三";
    root["年龄"] = 22;
    root["成绩"].append(99);
    root["成绩"].append(89);
    root["成绩"].append(95.5);
    //2.创建出一个StreamWriterBuilder对象
    Json::StreamWriterBuilder swb;
    //3.使用StreamWriterBuilder实例化出一个StreamWriter对象
    Json::StreamWriter* sw = swb.newStreamWriter();
    //4.使用StreamWriter.write把Json::Value对象序列化
    std::stringstream ss;
    /**
     * 序列化接口使用
     * 首先需要创建出StreamWriterBuilder对象
     * 然后使用其new出StreamWriter对象
     * 然后使用StreamWriter下的write函数将实例化出的Json::Value对象存储到ostream流中
     * class JSON_API StreamWriter {
        virtual int write(Value const& root, std::ostream* sout) = 0;
        }
       class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
        virtual StreamWriter* newStreamWriter() const;
        }
    */
    sw->write(root,&ss);
    delete sw;
    return ss.str();
}
//反序列化
/**
 * class JSON_API CharReader {
    virtual bool parse(char const* beginDoc, char const* endDoc, 
    Value* root, std::string* errs) = 0;
  }
   class JSON_API CharReaderBuilder : public CharReader::Factory {
    virtual CharReader* newCharReader() const;
   }
   反序列化操作使用
   首先先创建CharReaderBuilder对象，再使用其实例化出CharReader对象
   再使用CharReader对象中的parse函数对传入的序列化参数进行反序列化操作
            parse()函数中四个参数：1.开始位置 2.结束位置 3.存放到哪个Value对象 4.出错后的错误信息
    最后想要使用解析出来的信息，只需要在3中存放的Value对象中查看即可
*/
Json::Value unserialize(const std::string str)
{
    //1.创建CharReaderBuilder对象
    Json::CharReaderBuilder crb;
    //2.使用CharReaderBuilder实例化出CharReader对象
    Json::CharReader* cr = crb.newCharReader();
    //3.使用CharReader.parse()函数解析数据
    Json::Value root;
    std::string err;
    bool ret = cr->parse(str.c_str(),str.c_str() + str.size(),&root,&err);
    if(ret == false)
    {
        std::cout << "json unserialize err:" << err << std::endl;
        return -1;
    }
    delete cr;
    return root;
}

int main()
{
    //序列化操作
    std::string serial_str = serialize();
    std::cout << serial_str << std::endl;
    //反序列化操作
    Json::Value un_root = unserialize(serial_str);
    std::cout << "姓名: " << un_root["姓名"].asString() << std::endl;
    std::cout << "年龄: " << un_root["年龄"].asInt() << std::endl;
    int size = un_root["成绩"].size();
    for(int i = 0; i < size; i++)
    {
        std::cout << "成绩: " << un_root["成绩"][i].asString() << std::endl;
    }

    return 0;
}